1 Firing rate of IL neurons during glycinergic fiber activation

In these experiments glycinergic fibers were photactivated while the firing rate of individual IL neurons was recorded. Some of the IL cells had very low baseline activity. In order to increase the firing rate of the IL neurons and to detect the effect of the glycinergic fiber activation a small tail pinch was applied. The firing rate of the recorded IL cells decreased during the glycinergic fiber activation.

1.1 Loading data

Loading AP and stimuli times from stimulus and from baseline data to IL_stim_firing and to IL_baseline_firing tables:

IL_stim_firing <- CreateRecTibble(AP_times = read_csv(file.path("data", 
    "IL_MFR", "stimulus", "AP_times.csv")), 
    stim_times = read_csv(file.path("data", 
        "IL_MFR", "stimulus", "stim_times.csv")))
IL_stim_firing %>% head()
IL_baseline_firing <- CreateRecTibble(
  AP_times = read_csv(file.path("data", "IL_MFR","baseline", "AP_times.csv")),
  stim_times = read_csv(file.path("data", "IL_MFR","baseline", "stim_times.csv"))
)
IL_stim_firing %>% head()



1.2 Summary information

Summary information of the stimulus and baseline recording files:

  • Variables:
    • file names (file_name)
    • number of channels in the raw recording files (No_ch)
    • number of APs (No_AP_unit, No_AP_unit2)
    • number of stimulus trains (No_Stim)
    • LFP sampling rate (samp_rate_lfp)
    • unit sampling rate (samp_rate_unit)
    • length of the recording (rec_length)
    • length of the stimulus trains (No_trains)
    • Are the lengths of the stimulus trains equal in the recording (train_length_equal)
    • starting time of the stimulus trains (train_start)
    • ending time of the stimulus trains (train_end)



CELL_INFO table to store the cell categories. It was created manually using the information from the summary excel table (Glicy_juxta-fm_exp_records_injection_sum.xls)

  • Variables
    • cell identification (cell_id). To find the recording file use the summary excel table
    • file names (file_name)
    • spontaneously active cells (bl_activity)
    • induced firing (pinch)
    • individually identified neurons (ident)
    • control cells (control)



1.3 Calculations

1.3.1 Firing rates

b_d_a_MFR: Calculating the number of APs -using a custom made function (BDACalculator)- before during and after the stimulus trains (b_d_a_MFR).

b_d_a_MFR <- lapply(CELL_INFO$cell_id, BDACalculator, data = IL_stim_firing) %>% 
  bind_rows() %>%  
  mutate(FR = No_AP / train_length) %>%
  dplyr::group_by(stim_cond, cell_id) %>%
  summarise(MFR = mean(FR))
`as.tibble()` is deprecated, use `as_tibble()` (but mind the new semantics).
This warning is displayed once per session.


sd_mean_isi: Calculating the baseline MFR of the recorded IL cells from the IL_baseline_firing table using a custom made function (SDMeanISI). The results are stored in the sd_mean_isi table.


1.3.2 Ranks (strength of inhibition)

cellranks: Calculating ranks based on the activity change from “baseline” to “during stimulus”. If the activity change is negative (decreased MFR) the asigned rank is negative, if it is positive (increased MFR) the assigned rank is positive.


Calculating the firing rate change during stimulus (photoactivation of the glycinergic fibers) compared to baseline:




\[\mathbf{activity\_change} = \frac{during\_MFR - base\_MFR}{base\_MFR} * 100\]

cellranks <- b_d_a_MFR %>% 
  group_by(stim_cond) %>%
  mutate(base_MFR = sd_mean_isi$MFR) %>% 
  mutate(activity_change = ((MFR-base_MFR)/base_MFR*100) %>% round(2)) %>% 
  dplyr::filter(stim_cond == "d") %>% 
  mutate(change_rank = ifelse(activity_change>0, 
                              rank(activity_change), 
                              -rank(-activity_change)) ) %>% 
  ungroup() %>% 
  left_join(CELL_INFO %>% 
              select(cell_id, control, pinch, position),
            by = "cell_id")
cellranks

cellranks_before_stim: Calculating ranks based on the activity change from “before stimulus” to “during stimulus”. If the activity change is negative (decreased MFR) the asigned rank is negative, if it is positive (increased MFR) the assigned rank is positive.


Calculating the firing rate change during stimulus (photoactivation of the glycinergic fibers) compared to before stimulus:




\[\mathbf{activity\_change} = \frac{during\_MFR - before\_MFR}{before\_MFR} * 100\]

cellranks_before_stim <- b_d_a_MFR %>% 
  spread(key = stim_cond,value = MFR) %>% 
  mutate(activity_change = ((d - b)/b*100) %>% round(2)) %>% 
  mutate(change_rank = ifelse(activity_change > 0, 
                              rank(activity_change), 
                              -rank(-activity_change))
         ) %>% 
  left_join(CELL_INFO %>% 
              select(cell_id, control, pinch, position),
            by = "cell_id")
cellranks_before_stim



1.3.3 Data to plot

TO_PLOT: Combining b_d_a_MFR (firing rate of 29 IL neurons b/d/a stim) with sd_mean_isi table (baseline firing rate of the same 29 neurons), joining with CELL_INFO containing important information of the cells (baseline activity, identified, pinched, control) and with cellranks containing the ranks asigned to each cells based on the changes in MFR during the stimulus compared to baseline.

TO_PLOT <- bind_rows(
  sd_mean_isi %>%
    select(MFR, cell_id, stim_cond),
  b_d_a_MFR
) %>% left_join(CELL_INFO %>% 
                  select(-file_name),
                by = "cell_id") %>% 
  left_join(cellranks %>% 
              select(cell_id, change_rank, activity_change), 
            by = "cell_id")

datatable(TO_PLOT,
          caption = "TO_PLOT table",
          rownames = TRUE, 
          options = list(pageLength = 50, scrollX=T, scrollY="500px",dom = 't'))



1.4 Plotting

1.4.1 Baseline vs. “before” stimulus activity

Comparison of baseline and “before” stimulus firing rates in the case of spontaneously active and sponteneously inactive (pinch) neurons. Spontaneously inactive neurons showed significantly higher MFR before stiulus compared to baseline.



1.4.2 MFR before, during and after stimulus



1.4.3 Strength of inhibition

Firing rate change during stimulus (photoactivation of the glycinergic fibers) compared to baseline:



Firing rate change during stimulus (photoactivation of the glycinergic fibers) compared to before stimulus:



Plotting the change in MFR from “baseline” to “during stimulus”. Coloring based on the strength of the inhibition (rank)













2 Activity of PRF glycinergic cells during PFC photoactivation

  • List of tibbles used to store data:
    • RECORDINGS tibble: stores AP and stim time stamps, number of stimuli in each train, stimulus frequency categories (eg. 8 10 and 12 Hz belong to 10 Hz category)
    • STIM_RESULTS: stores the data for PSTHs
datatable(RECORDINGS, caption = "RECORDINGS tibble", 
    rownames = TRUE, options = list(pageLength = 50, 
        scrollX = T, scrollY = "500px", 
        dom = "t"))

NA
NA

3 Spontaneous desynchronization of the FC slow oscillation

file_to_load <- file_list[[1]]
filename <- as.character(substring(file_to_load, 1, nchar(file_to_load) - 4))
raw.rec <- readMat(file.path("data", file_to_load))

###takes the first AP (first row) and tells the index of point with the max value
points_to_peak <- which(raw.rec$ap[, , 1]$values[1, ] ==
    max(raw.rec$ap[, , 1]$values[1, ])) %>%
    as.numeric()

### time of the peak of the APs after its first point
raw.rec$ap[, , 1]$interval * points_to_peak
        [,1]
[1,] 0.00055
ap <- raw.rec$ap[, , 1]$times %>% as.double()
ap_peaks <- tibble(peak_times = (ap + c(raw.rec$ap[, , 1]$interval * points_to_peak)))

——- insert code here ——–

(spont_desynchron_analysis.R), 7 recordings

4 Terminals

4.1 Loading data

4.2 Bouton area on different dendritic domains

4.3 Area of boutons with m2 and unknown origin

LS0tDQp0aXRsZTogIkZyb250YWwgY29ydGV4LWRyaXZlbiBnbHljaW5lcmdpYyBpbmhpYml0aW9uIG9mIHRoZSBpbnRyYWxhbWluYXIgdGhhbGFtdXMiDQphdXRob3I6ICJWaWt0b3IgUGxhdHRuZXIiDQpvdXRwdXQ6DQogIGh0bWxfbm90ZWJvb2s6DQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCiAgICB0b2M6IHllcw0KICAgIHRvY19mbG9hdDogeWVzDQogIHBkZl9kb2N1bWVudDoNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICAgIHRvYzogeWVzDQogICAga2VlcF90ZXg6IHRydWUNCiAgaHRtbF9kb2N1bWVudDoNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICAgIGRmX3ByaW50OiBwYWdlZA0KICAgIHRvYzogeWVzDQogICAgdG9jX2Zsb2F0OiB5ZXMNCnNwYWNpbmc6IHNpbmdsZQ0KZm9udHNpemU6IDEycHQNCmFsd2F5c19hbGxvd19odG1sOiB5ZXMNCi0tLQ0KDQoNCg0KDQo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KDQpib2R5eyAvKiBOb3JtYWwgICovDQogICAgICBmb250LXNpemU6IDE0cHg7DQogICAgICBmb250LWZhbWlseTogIkFyaWFsIiwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOw0KICB9DQp0ZCB7ICAvKiBUYWJsZSAgKi8NCiAgZm9udC1zaXplOiAxMnB4Ow0KfQ0KaDEudGl0bGUgew0KICBmb250LXNpemU6IDM4cHg7DQogIGZvbnQtZmFtaWx5OiAiQXJpYWwiLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7DQogIGNvbG9yOiAjNGQ0ZTRmOw0KfQ0KaDEgeyAvKiBIZWFkZXIgMSAqLw0KICBmb250LXNpemU6IDI4cHg7DQogIGZvbnQtZmFtaWx5OiAiQXJpYWwiLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7DQogIGNvbG9yOiAjMmMzYTNlOw0KfQ0KaDIgeyAvKiBIZWFkZXIgMiAqLw0KICBmb250LXNpemU6IDIycHg7DQogIGZvbnQtZmFtaWx5OiAiQXJpYWwiLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7DQogIGNvbG9yOiAjMmMzYTNlOw0KfQ0KaDMgeyAvKiBIZWFkZXIgMyAqLw0KICBmb250LXNpemU6IDE4cHg7DQogIGZvbnQtZmFtaWx5OiAiQXJpYWwiLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7DQogIGNvbG9yOiAjMmMzYTNlOw0KfQ0KY29kZS5yeyAvKiBDb2RlIGJsb2NrICovDQogICAgZm9udC1zaXplOiAxMnB4Ow0KfQ0KcHJlIHsgLyogQ29kZSBibG9jayAtIGRldGVybWluZXMgY29kZSBzcGFjaW5nIGJldHdlZW4gbGluZXMgKi8NCiAgICBmb250LXNpemU6IDE0cHg7DQp9DQo8L3N0eWxlPg0KDQoNCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQpsaWJyYXJ5KFIubWF0bGFiKQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KHJlc2hhcGUyKQ0KbGlicmFyeShnZ3JlcGVsKQ0KbGlicmFyeShEVCkNCmxpYnJhcnkoZ2dwdWJyKQ0KbGlicmFyeShzdHlsZXIpDQpsaWJyYXJ5KGZvcm1hdFIpDQoNCmxpYnJhcnkoYnNwZWMpICMjIyBwb3dlciBzcGVjdHJ1bQ0KbGlicmFyeShXYXZlbGV0Q29tcCkgIyMjIHdhdmVsZXQNCmxpYnJhcnkoZGlwdGVzdCkgIyMjIHRvIHRlc3QgZGlzdHJpYnV0aW9uIHVuaS9tdWx0aW1vZGFsaXR5IChJU0kpDQpsaWJyYXJ5KGV4YWN0UmFua1Rlc3RzKSAjIyMgd2lsY294LnRlc3QgZm9yIHRpZXMNCmxpYnJhcnkoV2F2ZWxldENvbXApICMjIyB3YXZlbGV0DQpsaWJyYXJ5KHNpZ25hbCkNCg0KbGlicmFyeShTVEFSKQ0KbGlicmFyeShzZWUpICNmb3IgaGFsZiB2aW9saW5wbG90DQpsaWJyYXJ5KGdnaGFsdmVzKSAjZm9yIGhhbGYgdmlvbGlucGxvdA0KDQpzb3VyY2UoZmlsZS5wYXRoKCJzdXBwbGVtZW50YXJ5X2Z1bmN0aW9ucyIsICJDcmVhdGVSZWNUaWJibGUuUiIpKQ0KDQprbml0cjo6b3B0c19jaHVuayRzZXQodGlkeSA9IFRSVUUsIHRpZHkub3B0cyA9IGxpc3Qod2lkdGguY3V0b2ZmPTMwKSkNCmBgYA0KDQoNCjxicj48YnI+DQoNCg0KDQojIEZpcmluZyByYXRlIG9mIElMIG5ldXJvbnMgZHVyaW5nIGdseWNpbmVyZ2ljIGZpYmVyIGFjdGl2YXRpb24NCg0KSW4gdGhlc2UgZXhwZXJpbWVudHMgZ2x5Y2luZXJnaWMgZmliZXJzIHdlcmUgcGhvdGFjdGl2YXRlZCB3aGlsZSB0aGUgZmlyaW5nIHJhdGUgb2YgaW5kaXZpZHVhbCBJTCBuZXVyb25zIHdhcyByZWNvcmRlZC4gU29tZSBvZiB0aGUgSUwgY2VsbHMgaGFkIHZlcnkgbG93IGJhc2VsaW5lIGFjdGl2aXR5LiBJbiBvcmRlciB0byBpbmNyZWFzZSB0aGUgZmlyaW5nIHJhdGUgb2YgdGhlIElMIG5ldXJvbnMgYW5kIHRvIGRldGVjdCB0aGUgZWZmZWN0IG9mIHRoZSBnbHljaW5lcmdpYyBmaWJlciBhY3RpdmF0aW9uIGEgc21hbGwgdGFpbCBwaW5jaCB3YXMgYXBwbGllZC4gVGhlIGZpcmluZyByYXRlIG9mIHRoZSByZWNvcmRlZCBJTCBjZWxscyBkZWNyZWFzZWQgZHVyaW5nIHRoZSBnbHljaW5lcmdpYyBmaWJlciBhY3RpdmF0aW9uLiANCg0KDQojIyBMb2FkaW5nIGRhdGENCg0KDQpMb2FkaW5nIEFQIGFuZCBzdGltdWxpIHRpbWVzIGZyb20gKnN0aW11bHVzKiBhbmQgZnJvbSAqYmFzZWxpbmUqIGRhdGEgdG8gKipJTF9zdGltX2ZpcmluZyoqIGFuZCB0byAqKklMX2Jhc2VsaW5lX2ZpcmluZyoqIHRhYmxlczoNCg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHRpZHk9VFJVRX0NCklMX3N0aW1fZmlyaW5nIDwtIENyZWF0ZVJlY1RpYmJsZSggICAgDQogIEFQX3RpbWVzID0gcmVhZF9jc3YoZmlsZS5wYXRoKCJkYXRhIiwgIklMX01GUiIsICJzdGltdWx1cyIsICJBUF90aW1lcy5jc3YiKSksICANCiAgc3RpbV90aW1lcyA9IHJlYWRfY3N2KGZpbGUucGF0aCgiZGF0YSIsICJJTF9NRlIiLCJzdGltdWx1cyIsICJzdGltX3RpbWVzLmNzdiIpKQ0KKSANCklMX3N0aW1fZmlyaW5nICU+JSBoZWFkKCkNCmBgYA0KDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCklMX2Jhc2VsaW5lX2ZpcmluZyA8LSBDcmVhdGVSZWNUaWJibGUoDQogIEFQX3RpbWVzID0gcmVhZF9jc3YoZmlsZS5wYXRoKCJkYXRhIiwgIklMX01GUiIsImJhc2VsaW5lIiwgIkFQX3RpbWVzLmNzdiIpKSwNCiAgc3RpbV90aW1lcyA9IHJlYWRfY3N2KGZpbGUucGF0aCgiZGF0YSIsICJJTF9NRlIiLCJiYXNlbGluZSIsICJzdGltX3RpbWVzLmNzdiIpKQ0KKQ0KSUxfc3RpbV9maXJpbmcgJT4lIGhlYWQoKQ0KYGBgDQoNCjxicj48YnI+DQoNCiMjIFN1bW1hcnkgaW5mb3JtYXRpb24gDQoNClN1bW1hcnkgaW5mb3JtYXRpb24gb2YgdGhlICpzdGltdWx1cyogYW5kICAqYmFzZWxpbmUqIHJlY29yZGluZyBmaWxlczoNCg0KKiBWYXJpYWJsZXM6DQogICsgZmlsZSBuYW1lcyAoKmZpbGVfbmFtZSopDQogICsgbnVtYmVyIG9mIGNoYW5uZWxzIGluIHRoZSByYXcgcmVjb3JkaW5nIGZpbGVzICgqTm9fY2gqKQ0KICArIG51bWJlciBvZiBBUHMgKCpOb19BUF91bml0KiwgKk5vX0FQX3VuaXQyKikNCiAgKyBudW1iZXIgb2Ygc3RpbXVsdXMgdHJhaW5zICgqTm9fU3RpbSopDQogICsgTEZQIHNhbXBsaW5nIHJhdGUgKCpzYW1wX3JhdGVfbGZwKikNCiAgKyB1bml0IHNhbXBsaW5nIHJhdGUgKCpzYW1wX3JhdGVfdW5pdCopDQogICsgbGVuZ3RoIG9mIHRoZSByZWNvcmRpbmcgKCpyZWNfbGVuZ3RoKikNCiAgKyBsZW5ndGggb2YgdGhlIHN0aW11bHVzIHRyYWlucyAoKk5vX3RyYWlucyopDQogICsgQXJlIHRoZSBsZW5ndGhzIG9mIHRoZSBzdGltdWx1cyB0cmFpbnMgZXF1YWwgaW4gdGhlIHJlY29yZGluZyAoKnRyYWluX2xlbmd0aF9lcXVhbCopDQogICsgc3RhcnRpbmcgdGltZSBvZiB0aGUgc3RpbXVsdXMgdHJhaW5zICgqdHJhaW5fc3RhcnQqKQ0KICArIGVuZGluZyB0aW1lIG9mIHRoZSBzdGltdWx1cyB0cmFpbnMgKCp0cmFpbl9lbmQqKQ0KDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSxlY2hvPUZBTFNFIH0NCg0KaW5mb19zdGltIDwtIHJlYWRfY3N2KGZpbGUucGF0aCgiZGF0YSIsICJJTF9NRlIiLCAic3RpbXVsdXMiLCAiZmlsZV9pbmZvLmNzdiIpKQ0KZGF0YXRhYmxlKGluZm9fc3RpbSwgDQogICAgICAgICAgY2FwdGlvbiA9IlN1bW1hcnkgdGFibGUgb2YgdGhlIHN0aW11bHVzIHJlY29yZGluZyBmaWxlcyAoaW5mb19zdGltKSIsIA0KICAgICAgICAgIHJvd25hbWVzID0gVFJVRSwgDQogICAgICAgICAgb3B0aW9ucyA9IGxpc3QocGFnZUxlbmd0aCA9IDUwLCBzY3JvbGxYPVQsIHNjcm9sbFkgPSAiNTAwcHgiLCBkb20gPSAndCcpKQ0KYGBgDQoNCjxicj4NCg0KYGBge3IsbWVzc2FnZT1GQUxTRSxlY2hvPUZBTFNFfQ0KaW5mb19iYXNlbGluZSA8LSByZWFkX2NzdihmaWxlLnBhdGgoImRhdGEiLCAiSUxfTUZSIiwgImJhc2VsaW5lIiwiZmlsZV9pbmZvLmNzdiIpKQ0KZGF0YXRhYmxlKGluZm9fYmFzZWxpbmUsIA0KICAgICAgICAgIGNhcHRpb24gPSJTdW1tYXJ5IHRhYmxlIG9mIHRoZSBiYXNlbGluZSByZWNvcmRpbmcgZmlsZXMgKGluZm9fYmFzZWxpbmUpIiwNCiAgICAgICAgICByb3duYW1lcyA9IFRSVUUsIA0KICAgICAgICAgIG9wdGlvbnMgPSBsaXN0KHBhZ2VMZW5ndGggPSA1MCwgc2Nyb2xsWD1ULCBzY3JvbGxZPSI1MDBweCIsZG9tID0gJ3QnKSkgIA0KYGBgDQo8YnI+DQoNCioqQ0VMTF9JTkZPKiogdGFibGUgdG8gc3RvcmUgdGhlIGNlbGwgY2F0ZWdvcmllcy4gSXQgd2FzIGNyZWF0ZWQgbWFudWFsbHkgdXNpbmcgdGhlIGluZm9ybWF0aW9uIGZyb20gdGhlIHN1bW1hcnkgZXhjZWwgdGFibGUgKCpHbGljeV9qdXh0YS1mbV9leHBfcmVjb3Jkc19pbmplY3Rpb25fc3VtLnhscyopDQoNCiogVmFyaWFibGVzDQogICsgY2VsbCBpZGVudGlmaWNhdGlvbiAoKmNlbGxfaWQqKS4gVG8gZmluZCB0aGUgcmVjb3JkaW5nIGZpbGUgdXNlIHRoZSBzdW1tYXJ5IGV4Y2VsIHRhYmxlDQogICsgZmlsZSBuYW1lcyAoKmZpbGVfbmFtZSopDQogICsgc3BvbnRhbmVvdXNseSBhY3RpdmUgY2VsbHMgKCpibF9hY3Rpdml0eSopDQogICsgaW5kdWNlZCBmaXJpbmcgKCpwaW5jaCopDQogICsgaW5kaXZpZHVhbGx5IGlkZW50aWZpZWQgbmV1cm9ucyAoKmlkZW50KikNCiAgKyBjb250cm9sIGNlbGxzICgqY29udHJvbCopDQoNCg0KYGBge3IsIGVjaG89RkFMU0V9DQojIyMgQ0VMTCBJTkZPIHRvIHN0b3JlIGNhdGVnb3JpZXMgKHNwb250YW5lb3VzbHkgYWN0aXZlLCBpbmR1Y2VkIGZpcmluZywgaWRlbnRpZmllZCkNCkNFTExfSU5GTyA8LSBpbmZvX2Jhc2VsaW5lICU+JQ0KICBzZWxlY3QoZmlsZV9uYW1lKSAlPiUNCiAgYWRkX2NvbHVtbihjZWxsX2lkID0gc3Vic3RyKGluZm9fYmFzZWxpbmUkZmlsZV9uYW1lLCAxLCA2KSwgLmJlZm9yZSA9ICJmaWxlX25hbWUiKSAlPiUNCiAgbXV0YXRlKGJsX2FjdGl2aXR5ID0gVCkgJT4lDQogIG11dGF0ZShibF9hY3Rpdml0eSA9IHJlcGxhY2UoDQogICAgYmxfYWN0aXZpdHksIA0KICAgIC4kY2VsbF9pZCA9PSAiY2VsbDA1IiB8DQogICAgICAuJGNlbGxfaWQgPT0gImNlbGwxMCIgfA0KICAgICAgLiRjZWxsX2lkID09ICJjZWxsMTIiIHwNCiAgICAgIC4kY2VsbF9pZCA9PSAiY2VsbDEzIiB8DQogICAgICAuJGNlbGxfaWQgPT0gImNlbGwxNCIgfA0KICAgICAgLiRjZWxsX2lkID09ICJjZWxsMTUiIHwNCiAgICAgIC4kY2VsbF9pZCA9PSAiY2VsbDIxIiB8DQogICAgICAuJGNlbGxfaWQgPT0gImNlbGwyNCIsDQogICAgRg0KICApKSAlPiUNCiAgbXV0YXRlKHBpbmNoID0gVCkgJT4lDQogIG11dGF0ZShwaW5jaCA9IHJlcGxhY2UoDQogICAgcGluY2gsIA0KICAgIC4kY2VsbF9pZCA9PSAiY2VsbDAxIiB8DQogICAgICAuJGNlbGxfaWQgPT0gImNlbGwwNiIgfA0KICAgICAgLiRjZWxsX2lkID09ICJjZWxsMDciIHwNCiAgICAgIC4kY2VsbF9pZCA9PSAiY2VsbDA4IiB8DQogICAgICAuJGNlbGxfaWQgPT0gImNlbGwxOCIgfA0KICAgICAgLiRjZWxsX2lkID09ICJjZWxsMTkiIHwNCiAgICAgIC4kY2VsbF9pZCA9PSAiY2VsbDIwIiB8DQogICAgICAuJGNlbGxfaWQgPT0gImNlbGwyMSIgfA0KICAgICAgLiRjZWxsX2lkID09ICJjZWxsMjMiIHwNCiAgICAgIC4kY2VsbF9pZCA9PSAiY2VsbDI0IiB8DQogICAgICAuJGNlbGxfaWQgPT0gImNlbGwyNSIgfA0KICAgICAgLiRjZWxsX2lkID09ICJjZWxsMjYiIHwNCiAgICAgIC4kY2VsbF9pZCA9PSAiY2VsbDI3IiB8DQogICAgICAuJGNlbGxfaWQgPT0gImNlbGwyOCIsDQogICAgRg0KICApKSAlPiUNCiBtdXRhdGUoaWRlbnQgPSBUKSAlPiUNCiAgbXV0YXRlKGlkZW50ID0gcmVwbGFjZSgNCiAgICBpZGVudCwNCiAgICAuJGNlbGxfaWQgPT0gImNlbGwwNiIgfA0KICAgICAgLiRjZWxsX2lkID09ICJjZWxsMDciIHwNCiAgICAgIC4kY2VsbF9pZCA9PSAiY2VsbDExIiB8DQogICAgICAuJGNlbGxfaWQgPT0gImNlbGwxMiIgfA0KICAgICAgLiRjZWxsX2lkID09ICJjZWxsMTMiIHwNCiAgICAgIC4kY2VsbF9pZCA9PSAiY2VsbDE0IiB8DQogICAgICAuJGNlbGxfaWQgPT0gImNlbGwyMSIgfA0KICAgICAgLiRjZWxsX2lkID09ICJjZWxsMjIiIHwNCiAgICAgIC4kY2VsbF9pZCA9PSAiY2VsbDIzIiB8DQogICAgICAuJGNlbGxfaWQgPT0gImNlbGwyNCIgfA0KICAgICAgLiRjZWxsX2lkID09ICJjZWxsMjUiIHwNCiAgICAgIC4kY2VsbF9pZCA9PSAiY2VsbDI2IiB8DQogICAgICAuJGNlbGxfaWQgPT0gImNlbGwyNyIsDQogICAgRg0KICApKSAlPiUgDQogIG11dGF0ZShjb250cm9sID0gRikgJT4lIA0KICBtdXRhdGUoY29udHJvbCA9IHJlcGxhY2UoDQogICAgY29udHJvbCwNCiAgICAuJGNlbGxfaWQgPT0gImNlbGwyNSIgfA0KICAgICAgLiRjZWxsX2lkID09ICJjZWxsMjYiIHwNCiAgICAgIC4kY2VsbF9pZCA9PSAiY2VsbDI3IiB8DQogICAgICAuJGNlbGxfaWQgPT0gImNlbGwyOCIgfA0KICAgICAgLiRjZWxsX2lkID09ICJjZWxsMjkiLA0KICAgIFQpKSAlPiUgDQogIG11dGF0ZShwb3NpdGlvbiA9ICJ1bmtub3duIikgJT4lDQogIG11dGF0ZShwb3NpdGlvbiA9IHJlcGxhY2UoDQogICAgcG9zaXRpb24sDQogICAgLiRjZWxsX2lkID09ICJjZWxsMDEiIHwNCiAgICAgIC4kY2VsbF9pZCA9PSAiY2VsbDAyIiB8DQogICAgICAuJGNlbGxfaWQgPT0gImNlbGwwMyIgfA0KICAgICAgLiRjZWxsX2lkID09ICJjZWxsMTAiIHwNCiAgICAgIC4kY2VsbF9pZCA9PSAiY2VsbDExIiB8DQogICAgICAuJGNlbGxfaWQgPT0gImNlbGwxNCIgfA0KICAgICAgLiRjZWxsX2lkID09ICJjZWxsMTUiLA0KICAgICJJTCIpKSAlPiUNCiAgbXV0YXRlKHBvc2l0aW9uID0gcmVwbGFjZSgNCiAgICBwb3NpdGlvbiwNCiAgICAuJGNlbGxfaWQgPT0gImNlbGwyMCIgfA0KICAgICAgLiRjZWxsX2lkID09ICJjZWxsMjEiIHwNCiAgICAgIC4kY2VsbF9pZCA9PSAiY2VsbDIyIiwNCiAgICAidHJhbnNpZW50IikpICU+JSANCiAgbXV0YXRlKHBvc2l0aW9uID0gcmVwbGFjZSgNCiAgICBwb3NpdGlvbiwNCiAgICAuJGNlbGxfaWQgPT0gImNlbGwwOCIgfA0KICAgICAgLiRjZWxsX2lkID09ICJjZWxsMTYiIHwNCiAgICAgIC4kY2VsbF9pZCA9PSAiY2VsbDE3IiB8DQogICAgICAuJGNlbGxfaWQgPT0gImNlbGwyMyIgfA0KICAgICAgLiRjZWxsX2lkID09ICJjZWxsMjQiLA0KICAgICJQRiIpKQ0KDQpkYXRhdGFibGUoQ0VMTF9JTkZPLCANCiAgICAgICAgICBjYXB0aW9uID0gIkNFTExfSU5GTyB0YWJsZSIsDQogICAgICAgICAgcm93bmFtZXMgPSBUUlVFLCANCiAgICAgICAgICBvcHRpb25zID0gbGlzdChwYWdlTGVuZ3RoID0gNTAsIHNjcm9sbFg9VCwgc2Nyb2xsWT0iNTAwcHgiLGRvbSA9ICd0JykpICANCg0KI0lMX3N0aW1fZmlyaW5nJGZpbGVfbmFtZSAlPiUgdW5pcXVlKCkgJT4lIGxlbmd0aCgpDQojaW5mb19zdGltJGZpbGVfbmFtZSAlPiUgbGVuZ3RoKCkNCmBgYA0KDQoNCjxicj48YnI+DQoNCiMjIENhbGN1bGF0aW9ucw0KIyMjIEZpcmluZyByYXRlcw0KDQpgYGB7ciwgaW5jbHVkZT1GQUxTRX0NCiMjIyBDQUxDVUxBVElORyAtLS0tLS0tLQ0KDQpJTF9zdGltX2ZpcmluZyA8LSBsZWZ0X2pvaW4oSUxfc3RpbV9maXJpbmcsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9fc3RpbSAlPiUgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3QoZmlsZV9uYW1lLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY19sZW5ndGgsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhaW5fc3RhcnRzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWluX2VuZHMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhaW5fbGVuZ3RoKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgPSAiZmlsZV9uYW1lIikNCg0KIyMjIGNhbGN1bGF0aW5nIHN0aW0gc3RhcnQgdGltZXMgDQpzdGFydF90aW1lcyA8LSBJTF9zdGltX2ZpcmluZyAlPiUNCiAgZ3JvdXBfYnkoZmlsZV9uYW1lKSAlPiUNCiAgc3VtbWFyaXNlKHRyYWluX3N0YXJ0cyA9IHVuaXF1ZSh0cmFpbl9zdGFydHMpLCB0cmFpbl9lbmRzID0gdW5pcXVlKHRyYWluX2VuZHMpKSAlPiUNCiAgbXV0YXRlKGNlbGxfaWQgPSBzdWJzdHIoaW5mb19zdGltJGZpbGVfbmFtZSwgMSwgNikpICU+JQ0KICBncm91cF9ieShjZWxsX2lkKSAlPiUNCiAgc3VtbWFyaXNlKHRyYWluX3N0YXJ0cyA9IHVuaXF1ZSh0cmFpbl9zdGFydHMpKSAlPiUNCiAgcHVsbCh0cmFpbl9zdGFydHMpICU+JQ0KICBzdHJzcGxpdCgiLCIpICU+JQ0KICBzZXRfbmFtZXMoc3Vic3RyKGluZm9fc3RpbSRmaWxlX25hbWUsIDEsIDYpKSAlPiUNCiAgbGFwcGx5KGFzLm51bWVyaWMpDQoNCiMjIyBjYWxjdWxhdGluZyBzdGltIGVuZCB0aW1lcyANCmVuZF90aW1lcyA8LSBJTF9zdGltX2ZpcmluZyAlPiUNCiAgZ3JvdXBfYnkoZmlsZV9uYW1lKSAlPiUNCiAgc3VtbWFyaXNlKHRyYWluX3N0YXJ0cyA9IHVuaXF1ZSh0cmFpbl9zdGFydHMpLCB0cmFpbl9lbmRzID0gdW5pcXVlKHRyYWluX2VuZHMpKSAlPiUNCiAgbXV0YXRlKGNlbGxfaWQgPSBzdWJzdHIoaW5mb19zdGltJGZpbGVfbmFtZSwgMSwgNikpICU+JQ0KICBncm91cF9ieShjZWxsX2lkKSAlPiUNCiAgc3VtbWFyaXNlKHRyYWluX2VuZHMgPSB1bmlxdWUodHJhaW5fZW5kcykpICU+JQ0KICBwdWxsKHRyYWluX2VuZHMpICU+JQ0KICBzdHJzcGxpdCgiLCIpICU+JQ0KICBzZXRfbmFtZXMoc3Vic3RyKGluZm9fc3RpbSRmaWxlX25hbWUsIDEsIDYpKSAlPiUNCiAgbGFwcGx5KGFzLm51bWVyaWMpDQoNCg0KY2VsbF9saXN0IDwtIHN1YnN0cihpbmZvX3N0aW0kZmlsZV9uYW1lLCAxLCA2KQ0KQ0VMTF9JTkZPJGNlbGxfaWQNCmBgYA0KDQpgYGB7ciwgaW5jbHVkZT1GQUxTRX0NCiMjIyBmdW5jdGlvbiB0byBjYWxjdWxhdGUgdGhlIG51bWJlciBvZiBBUCBiL2QvYSBzdGltLiBBcmd1bWVudHM6IGRhdGEgKElMX3N0aW1fZmlyaW5nIHRhYmxlIHdpdGggcmVjX2xlbmd0aCBhbmQgc3RpbXVsdXMgdHJhaW4gaW5mb3JtYXRpb24pDQpCREFDYWxjdWxhdG9yIDwtIGZ1bmN0aW9uKGRhdGEsIGxpc3QpIHsNCiAgY2VsbF9saXN0IDwtIGxpc3QNCiAgDQogICAgdHJhaW5fbGVuZ3RoIDwtIGRhdGEgJT4lDQogICAgICBkcGx5cjo6ZmlsdGVyKHN1YnN0cihmaWxlX25hbWUsIDEsIDYpID09IGNlbGxfbGlzdCkgJT4lDQogICAgICBzZWxlY3QodHJhaW5fbGVuZ3RoKSAlPiUNCiAgICAgIHB1bGwoKSAlPiUNCiAgICAgIGBbW2AoMSkNCiAgDQogIA0KICANCiAgaWYgKA0KICAgIChkYXRhICU+JQ0KICAgICAgZHBseXI6OmZpbHRlcihzdWJzdHIoZmlsZV9uYW1lLCAxLCA2KSA9PSBjZWxsX2xpc3QsIHNpZ25hbF90eXBlID09ICJBUCIpICU+JQ0KICAgICAgc2VsZWN0KHVuaXRfaWQpICU+JQ0KICAgICAgdW5pcXVlKCkgJT4lDQogICAgICBwdWxsKCkgJT4lDQogICAgICBsZW5ndGgoKSkgPT0gMQ0KICApIHsNCiAgICAjIyMgSW4gY2FzZSBvZiBvbmUgdW5pdCBpbiB0aGUgZmlsZToNCiAgICBBUF90aW1lcyA8LSBkYXRhICU+JQ0KICAgICAgZHBseXI6OmZpbHRlcihzdWJzdHIoZmlsZV9uYW1lLCAxLCA2KSA9PSBjZWxsX2xpc3QsIHNpZ25hbF90eXBlID09ICJBUCIpICU+JQ0KICAgICAgc2VsZWN0KHNpZ25hbF90aW1lKSAlPiUNCiAgICAgIHB1bGwoKQ0KICAgIA0KICAgIEFQX251bWJlcnMgPC0gbWF0cml4KDAsIG5yb3cgPSBsZW5ndGgoc3RhcnRfdGltZXNbW2NlbGxfbGlzdF1dKSwgbmNvbCA9IDMpDQogICAgY29sbmFtZXMoQVBfbnVtYmVycykgPC0gYygiYiIsICJkIiwgImEiKQ0KDQogICAgZm9yICh0cmFpbl9udW0gaW4gMTpsZW5ndGgoc3RhcnRfdGltZXNbW2NlbGxfbGlzdF1dKSkgew0KICAgICAgIyMjIGJlZm9yZQ0KICAgICAgQVBfbnVtYmVyc1t0cmFpbl9udW0sIDFdIDwtIGxlbmd0aChBUF90aW1lc1tzdGFydF90aW1lc1tbY2VsbF9saXN0XV1bdHJhaW5fbnVtXSAtIHRyYWluX2xlbmd0aA0KICAgICAgPCBBUF90aW1lcyAmIEFQX3RpbWVzIDwgc3RhcnRfdGltZXNbW2NlbGxfbGlzdF1dW3RyYWluX251bV1dKQ0KDQogICAgICAjIyMgZHVyaW5nDQogICAgICBBUF9udW1iZXJzW3RyYWluX251bSwgMl0gPC0gbGVuZ3RoKEFQX3RpbWVzW0FQX3RpbWVzID4gc3RhcnRfdGltZXNbW2NlbGxfbGlzdF1dW3RyYWluX251bV0gJiBBUF90aW1lcyA8IGVuZF90aW1lc1tbY2VsbF9saXN0XV1bdHJhaW5fbnVtXV0pDQoNCiAgICAgICMjIyBhZnRlcg0KICAgICAgQVBfbnVtYmVyc1t0cmFpbl9udW0sIDNdIDwtIGxlbmd0aChBUF90aW1lc1tBUF90aW1lcyA+IGVuZF90aW1lc1tbY2VsbF9saXN0XV1bdHJhaW5fbnVtXSAmDQogICAgICAgIEFQX3RpbWVzIDwgZW5kX3RpbWVzW1tjZWxsX2xpc3RdXVt0cmFpbl9udW1dICsgdHJhaW5fbGVuZ3RoXSkNCiAgICB9DQogICAgDQogICAgbWVsdChBUF9udW1iZXJzLCB2YXJuYW1lcyA9IGMoInRyYWluIiwgInN0aW1fY29uZCIpLCB2YWx1ZS5uYW1lID0gIk5vX0FQIikgJT4lDQogICAgICBhcy50aWJibGUoKSAlPiUNCiAgICAgIGFkZF9jb2x1bW4oY2VsbF9pZCA9IGNlbGxfbGlzdCkgJT4lIA0KICAgICAgYWRkX2NvbHVtbih0cmFpbl9sZW5ndGggPSB0cmFpbl9sZW5ndGgpDQogICAgDQogICAgDQogIH0gZWxzZSB7IA0KICAgICMjIyBpbiBjYXNlIG9mIG11bHRpcGxlIHVuaXRzIGluIHRoZSBmaWxlOg0KICAgIEFQX3RpbWVzXzEgPC0gZGF0YSAlPiUNCiAgICAgIGRwbHlyOjpmaWx0ZXIoc3Vic3RyKGZpbGVfbmFtZSwgMSwgNikgPT0gY2VsbF9saXN0LCBzaWduYWxfdHlwZSA9PSAiQVAiLCB1bml0X2lkID09IDEpICU+JQ0KICAgICAgc2VsZWN0KHNpZ25hbF90aW1lKSAlPiUNCiAgICAgIHB1bGwoKQ0KICAgIA0KICAgIEFQX251bWJlcnNfMSA8LSBtYXRyaXgoMCwgbnJvdyA9IGxlbmd0aChzdGFydF90aW1lc1tbY2VsbF9saXN0XV0pLCBuY29sID0gMykNCiAgICBjb2xuYW1lcyhBUF9udW1iZXJzXzEpIDwtIGMoImIiLCAiZCIsICJhIikNCiAgICANCiAgICBmb3IgKHRyYWluX251bSBpbiAxOmxlbmd0aChzdGFydF90aW1lc1tbY2VsbF9saXN0XV0pKSB7DQogICAgICAjIyMgYmVmb3JlDQogICAgICBBUF9udW1iZXJzXzFbdHJhaW5fbnVtLCAxXSA8LSBsZW5ndGgoQVBfdGltZXNfMVtzdGFydF90aW1lc1tbY2VsbF9saXN0XV1bdHJhaW5fbnVtXSAtIHRyYWluX2xlbmd0aA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IEFQX3RpbWVzXzEgJiBBUF90aW1lc18xIDwgc3RhcnRfdGltZXNbW2NlbGxfbGlzdF1dW3RyYWluX251bV1dKQ0KICAgICAgDQogICAgICAjIyMgZHVyaW5nDQogICAgICBBUF9udW1iZXJzXzFbdHJhaW5fbnVtLCAyXSA8LSBsZW5ndGgoQVBfdGltZXNfMVtBUF90aW1lc18xID4gc3RhcnRfdGltZXNbW2NlbGxfbGlzdF1dW3RyYWluX251bV0gJiANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVBfdGltZXNfMSA8IGVuZF90aW1lc1tbY2VsbF9saXN0XV1bdHJhaW5fbnVtXV0pDQogICAgICANCiAgICAgICMjIyBhZnRlcg0KICAgICAgQVBfbnVtYmVyc18xW3RyYWluX251bSwgM10gPC0gbGVuZ3RoKEFQX3RpbWVzXzFbQVBfdGltZXNfMSA+IGVuZF90aW1lc1tbY2VsbF9saXN0XV1bdHJhaW5fbnVtXSAmDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFQX3RpbWVzXzEgPCBlbmRfdGltZXNbW2NlbGxfbGlzdF1dW3RyYWluX251bV0gKyB0cmFpbl9sZW5ndGhdKQ0KICAgIH0NCiAgICANCiAgICANCiAgICBBUF90aW1lc18yIDwtIGRhdGEgJT4lDQogICAgICBkcGx5cjo6ZmlsdGVyKHN1YnN0cihmaWxlX25hbWUsIDEsIDYpID09IGNlbGxfbGlzdCwgc2lnbmFsX3R5cGUgPT0gIkFQIiwgdW5pdF9pZCA9PSAyKSAlPiUNCiAgICAgIHNlbGVjdChzaWduYWxfdGltZSkgJT4lDQogICAgICBwdWxsKCkNCiAgICANCiAgICBBUF9udW1iZXJzXzIgPC0gbWF0cml4KDAsIG5yb3cgPSBsZW5ndGgoc3RhcnRfdGltZXNbW2NlbGxfbGlzdF1dKSwgbmNvbCA9IDMpDQogICAgY29sbmFtZXMoQVBfbnVtYmVyc18yKSA8LSBjKCJiIiwgImQiLCAiYSIpDQogICAgDQogICAgZm9yICh0cmFpbl9udW0gaW4gMTpsZW5ndGgoc3RhcnRfdGltZXNbW2NlbGxfbGlzdF1dKSkgew0KICAgICAgIyMjIGJlZm9yZQ0KICAgICAgQVBfbnVtYmVyc18yW3RyYWluX251bSwgMV0gPC0gbGVuZ3RoKEFQX3RpbWVzXzJbc3RhcnRfdGltZXNbW2NlbGxfbGlzdF1dW3RyYWluX251bV0gLSB0cmFpbl9sZW5ndGgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwgQVBfdGltZXNfMiAmIEFQX3RpbWVzXzIgPCBzdGFydF90aW1lc1tbY2VsbF9saXN0XV1bdHJhaW5fbnVtXV0pDQogICAgICANCiAgICAgICMjIyBkdXJpbmcNCiAgICAgIEFQX251bWJlcnNfMlt0cmFpbl9udW0sIDJdIDwtIGxlbmd0aChBUF90aW1lc18yW0FQX3RpbWVzXzIgPiBzdGFydF90aW1lc1tbY2VsbF9saXN0XV1bdHJhaW5fbnVtXSAmIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUF90aW1lc18yIDwgZW5kX3RpbWVzW1tjZWxsX2xpc3RdXVt0cmFpbl9udW1dXSkNCiAgICAgIA0KICAgICAgIyMjIGFmdGVyDQogICAgICBBUF9udW1iZXJzXzJbdHJhaW5fbnVtLCAzXSA8LSBsZW5ndGgoQVBfdGltZXNfMltBUF90aW1lc18yID4gZW5kX3RpbWVzW1tjZWxsX2xpc3RdXVt0cmFpbl9udW1dICYNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVBfdGltZXNfMiA8IGVuZF90aW1lc1tbY2VsbF9saXN0XV1bdHJhaW5fbnVtXSArIHRyYWluX2xlbmd0aF0pDQogICAgfQ0KICAgIA0KICAgIA0KICAgIA0KICAgIGlmIChjZWxsX2xpc3QgJT4lIHN1YnN0cig1LDYpICU+JSBhcy5udW1lcmljKCkgJT4lIG5jaGFyKCkgPT0gMSkgew0KICAgICAgbmV3X25hbWUgPC0gcGFzdGUwKA0KICAgICAgICAiY2VsbDAiLA0KICAgICAgICBjZWxsX2xpc3QgJT4lIHN1YnN0cig1LDYpICU+JSBhcy5udW1lcmljKCkgKyAxDQogICAgICApDQogICAgfSANCiAgICAgIA0KICAgIGlmIChjZWxsX2xpc3QgJT4lIHN1YnN0cig1LDYpICU+JSBhcy5udW1lcmljKCkgJT4lIG5jaGFyKCkgPT0gMikgew0KICAgICAgbmV3X25hbWUgPC0gcGFzdGUwKA0KICAgICAgICAiY2VsbCIsDQogICAgICAgIGNlbGxfbGlzdCAlPiUgc3Vic3RyKDUsNikgJT4lIGFzLm51bWVyaWMoKSArIDENCiAgICAgICkNCiAgICB9DQogICAgDQogICAgYmluZF9yb3dzKA0KICAgICAgbWVsdChBUF9udW1iZXJzXzEsIHZhcm5hbWVzID0gYygidHJhaW4iLCAic3RpbV9jb25kIiksIHZhbHVlLm5hbWUgPSAiTm9fQVAiKSAlPiUNCiAgICAgICAgYXMudGliYmxlKCkgJT4lDQogICAgICAgIGFkZF9jb2x1bW4oY2VsbF9pZCA9IGNlbGxfbGlzdCkgJT4lIA0KICAgICAgICBhZGRfY29sdW1uKHRyYWluX2xlbmd0aCA9IHRyYWluX2xlbmd0aCksDQogICAgICANCiAgICAgIG1lbHQoQVBfbnVtYmVyc18yLCB2YXJuYW1lcyA9IGMoInRyYWluIiwgInN0aW1fY29uZCIpLCB2YWx1ZS5uYW1lID0gIk5vX0FQIikgJT4lDQogICAgICAgIGFzLnRpYmJsZSgpICU+JQ0KICAgICAgICBhZGRfY29sdW1uKGNlbGxfaWQgPSBuZXdfbmFtZSkgJT4lIA0KICAgICAgICBhZGRfY29sdW1uKHRyYWluX2xlbmd0aCA9IHRyYWluX2xlbmd0aCkNCiAgICApDQogICB9I2Vsc2UNCg0KfSNmb28NCmBgYA0KDQoqKmJfZF9hX01GUioqOiBDYWxjdWxhdGluZyB0aGUgbnVtYmVyIG9mIEFQcyAtdXNpbmcgYSBjdXN0b20gbWFkZSBmdW5jdGlvbiAoKkJEQUNhbGN1bGF0b3IqKS0gYmVmb3JlIGR1cmluZyBhbmQgYWZ0ZXIgdGhlIHN0aW11bHVzIHRyYWlucyAoKmJfZF9hX01GUiopLiANCg0KYGBge3J9DQpiX2RfYV9NRlIgPC0gbGFwcGx5KENFTExfSU5GTyRjZWxsX2lkLCBCREFDYWxjdWxhdG9yLCBkYXRhID0gSUxfc3RpbV9maXJpbmcpICU+JSANCiAgYmluZF9yb3dzKCkgJT4lICANCiAgbXV0YXRlKEZSID0gTm9fQVAgLyB0cmFpbl9sZW5ndGgpICU+JQ0KICBkcGx5cjo6Z3JvdXBfYnkoc3RpbV9jb25kLCBjZWxsX2lkKSAlPiUNCiAgc3VtbWFyaXNlKE1GUiA9IG1lYW4oRlIpKQ0KYGBgDQoNCjxicj4NCioqc2RfbWVhbl9pc2kqKjogQ2FsY3VsYXRpbmcgdGhlIGJhc2VsaW5lIE1GUiBvZiB0aGUgcmVjb3JkZWQgSUwgY2VsbHMgZnJvbSB0aGUgKklMX2Jhc2VsaW5lX2ZpcmluZyogdGFibGUgdXNpbmcgYSBjdXN0b20gbWFkZSBmdW5jdGlvbiAoKlNETWVhbklTSSopLiBUaGUgcmVzdWx0cyBhcmUgc3RvcmVkIGluIHRoZSAqc2RfbWVhbl9pc2kqIHRhYmxlLg0KDQpgYGB7ciwgaW5jbHVkZT1GQUxTRX0NCklMX2Jhc2VsaW5lX2ZpcmluZyA8LSBsZWZ0X2pvaW4oSUxfYmFzZWxpbmVfZmlyaW5nLA0KICBpbmZvX2Jhc2VsaW5lICU+JQ0KICAgIHNlbGVjdChmaWxlX25hbWUsIHJlY19sZW5ndGgpLA0KICBieSA9ICJmaWxlX25hbWUiDQopICU+JQ0KICBtdXRhdGUoc3RpbV9jb25kID0gImJhc2VsaW5lIikNCg0KIyMjIGZ1bmN0aW9uIHRvIGNhbGN1bGF0ZSBJU0kgbWVhbiBhbmQgU0QgZHVyaW5nIGJhc2VsaW5lIGFjdGl2aXR5IG9mIHRoZSBjZWxscw0KU0RNZWFuSVNJIDwtIGZ1bmN0aW9uKGZfbmFtZSkgew0KDQoNCiAgIyBtZWFuX2lzaSA8LSBJTF9iYXNlbGluZV9maXJpbmcgJT4lDQogICMgICBkcGx5cjo6ZmlsdGVyKGZpbGVfbmFtZSA9PSBmX25hbWUsIHNpZ25hbF90eXBlID09ICJBUCIpICU+JQ0KICAjICAgc2VsZWN0KHNpZ25hbF90aW1lKSAlPiUNCiAgIyAgIHB1bGwoKSAlPiUNCiAgIyAgIGRpZmYoKSAlPiUNCiAgIyAgIG1lYW4oKSAqIDEwMDAgJT4lDQogICMgICBgbmFtZXM8LWAoZl9uYW1lKQ0KICAjDQogICMgc2RfaXNpIDwtIElMX2Jhc2VsaW5lX2ZpcmluZyAlPiUNCiAgIyAgIGRwbHlyOjpmaWx0ZXIoZmlsZV9uYW1lID09IGZfbmFtZSwgc2lnbmFsX3R5cGUgPT0gIkFQIikgJT4lDQogICMgICBzZWxlY3Qoc2lnbmFsX3RpbWUpICU+JQ0KICAjICAgcHVsbCgpICU+JQ0KICAjICAgZGlmZigpICU+JQ0KICAjICAgc2QoKSAqIDEwMDAgJT4lDQogICMgICBgbmFtZXM8LWAoZl9uYW1lKQ0KICAjDQogICMgcmV0dXJuKGxpc3QoTUZSID0gbWVhbl9pc2ksDQogICMgICAgICAgICAgICAgU0RGUiA9IHNkX2lzaSkpDQoNCiAgdG1wMiA8LSBJTF9iYXNlbGluZV9maXJpbmcgJT4lDQogICAgZHBseXI6OmZpbHRlcihmaWxlX25hbWUgPT0gZl9uYW1lLCBzaWduYWxfdHlwZSA9PSAiQVAiKSAlPiUNCiAgICBzZWxlY3Qoc2lnbmFsX3RpbWUpICU+JQ0KICAgIHB1bGwoKSAlPiUNCiAgICBkaWZmKCkgJT4lDQogICAgbWVhbigpICogMTAwMCAlPiUNCiAgICAgIHRpYmJsZShtZWFuX2lzaSA9IC4pDQogIHRtcDIgJT4lDQogICAgbXV0YXRlKHNkX2lzaSA9IElMX2Jhc2VsaW5lX2ZpcmluZyAlPiUNCiAgICAgIGRwbHlyOjpmaWx0ZXIoZmlsZV9uYW1lID09IGZfbmFtZSwgc2lnbmFsX3R5cGUgPT0gIkFQIikgJT4lDQogICAgICBzZWxlY3Qoc2lnbmFsX3RpbWUpICU+JQ0KICAgICAgcHVsbCgpICU+JQ0KICAgICAgZGlmZigpICU+JQ0KICAgICAgc2QoKSAqIDEwMDApICU+JQ0KICAgIG11dGF0ZShmaWxlX25hbWUgPSBmX25hbWUpDQp9DQoNCnNkX21lYW5faXNpIDwtIGxhcHBseShpbmZvX2Jhc2VsaW5lJGZpbGVfbmFtZSwgU0RNZWFuSVNJKSAlPiUgDQogIGJpbmRfcm93cygpICU+JSANCiAgYXMudGliYmxlKCkNCg0Kc2RfbWVhbl9pc2kgPC0gc2RfbWVhbl9pc2kgJT4lDQogIG11dGF0ZShjZWxsX2lkID0gc3Vic3RyKHNkX21lYW5faXNpJGZpbGVfbmFtZSwgMSwgNikpICU+JQ0KICBtdXRhdGUoTUZSID0gMTAwMCAvIG1lYW5faXNpKSAlPiUNCiAgbXV0YXRlKFNEX0ZSID0gMTAwMCAvIHNkX2lzaSkgJT4lDQogIG11dGF0ZShNRlJfaW5jID0gTUZSICsgU0RfRlIpICU+JQ0KICBtdXRhdGUoTUZSX2RlYyA9IE1GUiAtIFNEX0ZSKSAlPiUNCiAgIyBtdXRhdGUoTUZSX2luYyA9IDEwMDAvKG1lYW5faXNpLXNkX2lzaSkpICU+JQ0KICAjIG11dGF0ZShNRlJfZGVjID0gMTAwMC8obWVhbl9pc2krc2RfaXNpKSkgJT4lDQogIG11dGF0ZShzdGltX2NvbmQgPSAiYmFzZWxpbmUiKSAlPiUNCiAgbXV0YXRlKE1GUl9kZWMgPSByZXBsYWNlKE1GUl9kZWMsIHNkX21lYW5faXNpJE1GUl9kZWMgPCAwLCAwKSkNCmBgYA0KPGJyPg0KDQojIyMgUmFua3MgKHN0cmVuZ3RoIG9mIGluaGliaXRpb24pDQoqKmNlbGxyYW5rcyoqOiBDYWxjdWxhdGluZyByYW5rcyBiYXNlZCBvbiB0aGUgYWN0aXZpdHkgY2hhbmdlIGZyb20gIipiYXNlbGluZSoiIHRvICIqZHVyaW5nIHN0aW11bHVzKiIuIElmIHRoZSBhY3Rpdml0eSBjaGFuZ2UgaXMgbmVnYXRpdmUgKGRlY3JlYXNlZCBNRlIpIHRoZSBhc2lnbmVkIHJhbmsgaXMgbmVnYXRpdmUsIGlmIGl0IGlzIHBvc2l0aXZlIChpbmNyZWFzZWQgTUZSKSB0aGUgYXNzaWduZWQgcmFuayBpcyBwb3NpdGl2ZS4NCg0KPGJyPg0KDQpDYWxjdWxhdGluZyB0aGUgZmlyaW5nIHJhdGUgY2hhbmdlIGR1cmluZyBzdGltdWx1cyAocGhvdG9hY3RpdmF0aW9uIG9mIHRoZSBnbHljaW5lcmdpYyBmaWJlcnMpIGNvbXBhcmVkIHRvIGJhc2VsaW5lOg0KDQo8YnI+PGJyPjxicj4NCg0KJCRcbWF0aGJme2FjdGl2aXR5XF9jaGFuZ2V9ID0gXGZyYWN7ZHVyaW5nXF9NRlIgLSBiYXNlXF9NRlJ9e2Jhc2VcX01GUn0gKiAxMDAkJA0KPGJyPg0KDQpgYGB7cn0NCmNlbGxyYW5rcyA8LSBiX2RfYV9NRlIgJT4lIA0KICBncm91cF9ieShzdGltX2NvbmQpICU+JQ0KICBtdXRhdGUoYmFzZV9NRlIgPSBzZF9tZWFuX2lzaSRNRlIpICU+JSANCiAgbXV0YXRlKGFjdGl2aXR5X2NoYW5nZSA9ICgoTUZSLWJhc2VfTUZSKS9iYXNlX01GUioxMDApICU+JSByb3VuZCgyKSkgJT4lIA0KICBkcGx5cjo6ZmlsdGVyKHN0aW1fY29uZCA9PSAiZCIpICU+JSANCiAgbXV0YXRlKGNoYW5nZV9yYW5rID0gaWZlbHNlKGFjdGl2aXR5X2NoYW5nZT4wLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmsoYWN0aXZpdHlfY2hhbmdlKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtcmFuaygtYWN0aXZpdHlfY2hhbmdlKSkgKSAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogIGxlZnRfam9pbihDRUxMX0lORk8gJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoY2VsbF9pZCwgY29udHJvbCwgcGluY2gsIHBvc2l0aW9uKSwNCiAgICAgICAgICAgIGJ5ID0gImNlbGxfaWQiKQ0KY2VsbHJhbmtzDQpgYGANCg0KDQoNCioqY2VsbHJhbmtzX2JlZm9yZV9zdGltKio6IENhbGN1bGF0aW5nIHJhbmtzIGJhc2VkIG9uIHRoZSBhY3Rpdml0eSBjaGFuZ2UgZnJvbSAiKmJlZm9yZSBzdGltdWx1cyoiIHRvICIqZHVyaW5nIHN0aW11bHVzKiIuIElmIHRoZSBhY3Rpdml0eSBjaGFuZ2UgaXMgbmVnYXRpdmUgKGRlY3JlYXNlZCBNRlIpIHRoZSBhc2lnbmVkIHJhbmsgaXMgbmVnYXRpdmUsIGlmIGl0IGlzIHBvc2l0aXZlIChpbmNyZWFzZWQgTUZSKSB0aGUgYXNzaWduZWQgcmFuayBpcyBwb3NpdGl2ZS4NCg0KPGJyPg0KDQpDYWxjdWxhdGluZyB0aGUgZmlyaW5nIHJhdGUgY2hhbmdlIGR1cmluZyBzdGltdWx1cyAocGhvdG9hY3RpdmF0aW9uIG9mIHRoZSBnbHljaW5lcmdpYyBmaWJlcnMpIGNvbXBhcmVkIHRvIGJlZm9yZSBzdGltdWx1czoNCg0KPGJyPjxicj48YnI+DQoNCiQkXG1hdGhiZnthY3Rpdml0eVxfY2hhbmdlfSA9IFxmcmFje2R1cmluZ1xfTUZSIC0gYmVmb3JlXF9NRlJ9e2JlZm9yZVxfTUZSfSAqIDEwMCQkDQo8YnI+DQoNCg0KDQpgYGB7cn0NCmNlbGxyYW5rc19iZWZvcmVfc3RpbSA8LSBiX2RfYV9NRlIgJT4lIA0KICBzcHJlYWQoa2V5ID0gc3RpbV9jb25kLHZhbHVlID0gTUZSKSAlPiUgDQogIG11dGF0ZShhY3Rpdml0eV9jaGFuZ2UgPSAoKGQgLSBiKS9iKjEwMCkgJT4lIHJvdW5kKDIpKSAlPiUgDQogIG11dGF0ZShjaGFuZ2VfcmFuayA9IGlmZWxzZShhY3Rpdml0eV9jaGFuZ2UgPiAwLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmsoYWN0aXZpdHlfY2hhbmdlKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtcmFuaygtYWN0aXZpdHlfY2hhbmdlKSkNCiAgICAgICAgICkgJT4lIA0KICBsZWZ0X2pvaW4oQ0VMTF9JTkZPICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGNlbGxfaWQsIGNvbnRyb2wsIHBpbmNoLCBwb3NpdGlvbiksDQogICAgICAgICAgICBieSA9ICJjZWxsX2lkIikNCmNlbGxyYW5rc19iZWZvcmVfc3RpbQ0KYGBgDQoNCg0KDQo8YnI+PGJyPg0KDQojIyMgRGF0YSB0byBwbG90DQoqKlRPX1BMT1QqKjogQ29tYmluaW5nICpiX2RfYV9NRlIqIChmaXJpbmcgcmF0ZSBvZiAyOSBJTCBuZXVyb25zIGIvZC9hIHN0aW0pIHdpdGggKnNkX21lYW5faXNpKiB0YWJsZSAoYmFzZWxpbmUgZmlyaW5nIHJhdGUgb2YgdGhlIHNhbWUgMjkgbmV1cm9ucyksIGpvaW5pbmcgd2l0aCBDRUxMX0lORk8gY29udGFpbmluZyBpbXBvcnRhbnQgaW5mb3JtYXRpb24gb2YgdGhlIGNlbGxzIChiYXNlbGluZSBhY3Rpdml0eSwgaWRlbnRpZmllZCwgcGluY2hlZCwgY29udHJvbCkgYW5kIHdpdGggKmNlbGxyYW5rcyogY29udGFpbmluZyB0aGUgcmFua3MgYXNpZ25lZCB0byBlYWNoIGNlbGxzIGJhc2VkIG9uIHRoZSBjaGFuZ2VzIGluIE1GUiBkdXJpbmcgdGhlIHN0aW11bHVzIGNvbXBhcmVkIHRvIGJhc2VsaW5lLg0KDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NClRPX1BMT1QgPC0gYmluZF9yb3dzKA0KICBzZF9tZWFuX2lzaSAlPiUNCiAgICBzZWxlY3QoTUZSLCBjZWxsX2lkLCBzdGltX2NvbmQpLA0KICBiX2RfYV9NRlINCikgJT4lIGxlZnRfam9pbihDRUxMX0lORk8gJT4lIA0KICAgICAgICAgICAgICAgICAgc2VsZWN0KC1maWxlX25hbWUpLA0KICAgICAgICAgICAgICAgIGJ5ID0gImNlbGxfaWQiKSAlPiUgDQogIGxlZnRfam9pbihjZWxscmFua3MgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoY2VsbF9pZCwgY2hhbmdlX3JhbmssIGFjdGl2aXR5X2NoYW5nZSksIA0KICAgICAgICAgICAgYnkgPSAiY2VsbF9pZCIpDQoNCmRhdGF0YWJsZShUT19QTE9ULA0KICAgICAgICAgIGNhcHRpb24gPSAiVE9fUExPVCB0YWJsZSIsDQogICAgICAgICAgcm93bmFtZXMgPSBUUlVFLCANCiAgICAgICAgICBvcHRpb25zID0gbGlzdChwYWdlTGVuZ3RoID0gNTAsIHNjcm9sbFg9VCwgc2Nyb2xsWT0iNTAwcHgiLGRvbSA9ICd0JykpDQpgYGANCjxicj48YnI+DQoNCiMjIFBsb3R0aW5nDQoNCiMjIyBCYXNlbGluZSB2cy4gImJlZm9yZSIgc3RpbXVsdXMgYWN0aXZpdHkNCg0KQ29tcGFyaXNvbiBvZiBiYXNlbGluZSBhbmQgImJlZm9yZSIgc3RpbXVsdXMgZmlyaW5nIHJhdGVzIGluIHRoZSBjYXNlIG9mIHNwb250YW5lb3VzbHkgYWN0aXZlIGFuZCBzcG9udGVuZW91c2x5IGluYWN0aXZlIChwaW5jaCkgbmV1cm9ucy4gU3BvbnRhbmVvdXNseSBpbmFjdGl2ZSBuZXVyb25zIHNob3dlZCBzaWduaWZpY2FudGx5IGhpZ2hlciBNRlIgYmVmb3JlIHN0aXVsdXMgY29tcGFyZWQgdG8gYmFzZWxpbmUuDQoNCmBgYHtyLCBmaWcud2lkdGg9MTAsIGVjaG8gPSBGQUxTRSwgd2FybmluZz1GQUxTRX0NCmdncGxvdCgNCiAgZGF0YSA9IFRPX1BMT1QgJT4lDQogICAgZHBseXI6OmZpbHRlcigNCiAgICAgIGNvbnRyb2wgPT0gRiwNCiAgICAgIHN0aW1fY29uZCA9PSAiYmFzZWxpbmUiIHwgc3RpbV9jb25kID09ICJiIg0KICAgICksDQogIG1hcHBpbmcgPSBhZXMoDQogICAgeCA9IGZvcmNhdHM6OmZjdF9yZWxldmVsKHN0aW1fY29uZCwgImJhc2VsaW5lIiwgImIiKSwNCiAgICB5ID0gTUZSDQogICkNCikgKw0KICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjIsIGFscGhhID0gMC41KSArDQogIGdlb21fcG9pbnQoYWVzKGZpbGwgPSBwaW5jaCksDQogICAgc2hhcGUgPSAyMSwNCiAgICAjIGZpbGwgPSAiI0VCODEwNCIsDQogICAgIyBjb2xvciA9ICJ3aGl0ZSIsDQogICAgc2l6ZSA9IDQNCiAgKSArDQogICMgc3Ryb2tlID0gMikgKw0KICBnZW9tX2xpbmUoDQogICAgYWVzKGdyb3VwID0gY2VsbF9pZCwgY29sID0gcGluY2gpDQogICkgKw0KICB0aGVtZShwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAwKSkgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZSgNCiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDIwKSwNCiAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyMCkNCiAgKSArDQogIHhsYWIoIlJlY29yZGluZyBwZXJpb2QiKSArDQogIGZhY2V0X3dyYXAodmFycyhwaW5jaCkpICsNCiAgc3RhdF9jb21wYXJlX21lYW5zKG1ldGhvZCA9ICJ3aWxjb3gudGVzdCIsIHBhaXJlZCA9IFQpICsNCiAgIGdlb21fbGFiZWxfcmVwZWwoDQogICAgZGF0YSA9IFRPX1BMT1QgJT4lDQogICAgICBkcGx5cjo6ZmlsdGVyKA0KICAgICAgICBjb250cm9sID09IEYsDQogICAgICAgIHN0aW1fY29uZCA9PSAiYmFzZWxpbmUiDQogICAgICApLA0KICAgIG1hcHBpbmcgPSBhZXMobGFiZWwgPSBjZWxsX2lkKSwNCiAgICBudWRnZV94ID0gLS45LA0KICAgIGRpcmVjdGlvbiA9ICJ5IiwNCiAgICAjIGhqdXN0ID0gMiwNCiAgICBzZWdtZW50LnNpemUgPSAuMg0KICApDQogDQpgYGANCg0KPGJyPjxicj4NCg0KIyMjIE1GUiBiZWZvcmUsIGR1cmluZyBhbmQgYWZ0ZXIgc3RpbXVsdXMgDQoNCmBgYHtyLCBmaWcud2lkdGg9MTQsIGZpZy5oZWlnaHQ9MTIgLGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpnZ3Bsb3QoDQogIGRhdGEgPSBUT19QTE9UICU+JQ0KICAgIGRwbHlyOjpmaWx0ZXIoDQogICAgICBjb250cm9sID09IEYsDQogICAgICBzdGltX2NvbmQgPT0gImIiIHwgc3RpbV9jb25kID09ICJkIiB8IHN0aW1fY29uZCA9PSAiYSINCiAgICApLA0KICBtYXBwaW5nID0gYWVzKA0KICAgIHggPSBmb3JjYXRzOjpmY3RfcmVsZXZlbChzdGltX2NvbmQsICJiIiwgImQiLCAiYSIpLA0KICAgIHkgPSBNRlINCiAgKQ0KKSArDQogIHRoZW1lKHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9IDApKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKA0KICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMjApLA0KICAgIHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDIwKQ0KICApICsNCiAgZ2d0aXRsZSgiUGluY2giLCkgKyANCiAgeGxhYigiUmVjb3JkaW5nIHBlcmlvZCIpICsNCiAgeWxpbSgwLCAzNSkgKw0KDQogIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMiwgYWxwaGEgPSAwLjUpICsNCiAgZ2VvbV9wb2ludCgNCiAgICBzaGFwZSA9IDIxLA0KICAgIGZpbGwgPSAiI0VCODEwNCIsDQogICAgI2NvbG9yID0gIndoaXRlIiwNCiAgICBzaXplID0gNA0KICApICsNCiAgIyBzdHJva2UgPSAyKSArDQogIGdlb21fbGluZSgNCiAgICBhZXMoZ3JvdXAgPSBjZWxsX2lkKSwgDQogICAgY29sb3IgPSAiI0VCODEwNCINCiAgKSArDQogIGdlb21fbGFiZWxfcmVwZWwoDQogICAgZGF0YSA9ICBUT19QTE9UICU+JQ0KICAgICAgZHBseXI6OmZpbHRlcigNCiAgICAgICAgY29udHJvbCA9PSBGLA0KICAgICAgICBzdGltX2NvbmQgPT0gImEiDQogICAgICApLA0KICAgIG1hcHBpbmcgPSBhZXMobGFiZWwgPSBjZWxsX2lkKSwNCiAgICBudWRnZV94ID0gMC4xNSwNCiAgICBkaXJlY3Rpb24gPSAieSIsDQogICAgaGp1c3QgPSAtMC41LA0KICAgIHNlZ21lbnQuc2l6ZSA9IC4yDQogICkgKw0KICBmYWNldF93cmFwKHZhcnMocGluY2gpKQ0KYGBgDQo8YnI+PGJyPg0KDQojIyMgU3RyZW5ndGggb2YgaW5oaWJpdGlvbg0KDQpGaXJpbmcgcmF0ZSBjaGFuZ2UgKipkdXJpbmcqKiBzdGltdWx1cyAocGhvdG9hY3RpdmF0aW9uIG9mIHRoZSBnbHljaW5lcmdpYyBmaWJlcnMpIGNvbXBhcmVkIHRvICoqYmFzZWxpbmUqKjoNCg0KYGBge3IsIGZpZy53aWR0aD0xMCwgZWNobz1GQUxTRSx3YXJuaW5nPUZBTFNFfQ0KZ2dwbG90KGRhdGEgPSBjZWxscmFua3MsDQogICAgICAgbWFwcGluZyA9IGFlcyh4ID0gY2hhbmdlX3JhbmssIHkgPSBhY3Rpdml0eV9jaGFuZ2UpKSArDQogIGdlb21fcG9pbnQoZGF0YSA9IGNlbGxyYW5rcyAlPiUgDQogICAgICAgICAgICAgICBkcGx5cjo6ZmlsdGVyKGNvbnRyb2wgPT0gRiksc2l6ZSA9IDMpICsNCiAgZ2VvbV9wb2ludChkYXRhID0gY2VsbHJhbmtzICU+JSANCiAgICAgICAgICAgICAgIGRwbHlyOjpmaWx0ZXIoY29udHJvbCA9PSBUKSwgc2l6ZSA9IDMsIGNvbCA9ICJtYWdlbnRhIikgKw0KICAjIyMgbGFiZWwgZm9yIG5lZ2F0aXZlIHZhbHVlcw0KICBnZW9tX3RleHRfcmVwZWwoZGF0YSA9IGNlbGxyYW5rcyAlPiUgDQogICAgICAgICAgICAgICAgICAgIGRwbHlyOjpmaWx0ZXIoYWN0aXZpdHlfY2hhbmdlIDwgMCksDQogICAgYWVzKGxhYmVsID0gY2VsbF9pZCksDQogICAgZGlyZWN0aW9uID0gInkiLA0KICAgIGFuZ2xlID0gOTAsDQogICAgaGp1c3QgPSAuNSwNCiAgICBudWRnZV95ID0gLTINCiAgICApICsNCiAgDQogICMjIyBsYWJlbCBmb3IgcG9zaXRpdmUgdmFsdWVzDQogIGdlb21fdGV4dF9yZXBlbChkYXRhID0gY2VsbHJhbmtzICU+JSANCiAgICAgICAgICAgICAgICAgICAgZHBseXI6OmZpbHRlcihhY3Rpdml0eV9jaGFuZ2UgPiAwKSwNCiAgICBhZXMobGFiZWwgPSBjZWxsX2lkKSwNCiAgICBkaXJlY3Rpb24gPSAieCIsDQogICAgYW5nbGUgPSAwLA0KICAgIGhqdXN0ID0gLjUsDQogICAgbnVkZ2VfeCA9IC0xDQogICAgKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGNvbCA9ICJncmV5IiwgbHR5ID0gImRhc2hlZCIpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gMjcsIHkgPSAtMTcsIGxhYmVsID0gIkJhc2VsaW5lIGFjdGl2aXR5IiwgY29sID0gImdyYXkiKSArDQogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGNvbCA9ICJncmV5IiwgbHR5ID0gImRhc2hlZCIpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gLTIsIHkgPSAyODAsIGxhYmVsID0gIk5lZ2F0aXZlIHJhbms6IEZSIGRlY3JlYXNlIiwgY29sID0gImdyYXkiLCBhbmdsZSA9IDkwKSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IDIsIHkgPSAyODAsIGxhYmVsID0gIlBvc2l0aXZlIHJhbms6IEZSIGluY3JlYXNlIiwgY29sID0gImdyYXkiLCBhbmdsZSA9IDkwKSArDQogIHRoZW1lX21pbmltYWwoKSArIA0KICB0aGVtZSgNCiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDIwKSwNCiAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyMCkNCiAgKSArDQogIHlsaW0oLW1heChjZWxscmFua3MkYWN0aXZpdHlfY2hhbmdlKSxtYXgoY2VsbHJhbmtzJGFjdGl2aXR5X2NoYW5nZSkpDQoNCmBgYA0KDQo8YnI+PGJyPg0KDQpGaXJpbmcgcmF0ZSBjaGFuZ2UgKipkdXJpbmcqKiBzdGltdWx1cyAocGhvdG9hY3RpdmF0aW9uIG9mIHRoZSBnbHljaW5lcmdpYyBmaWJlcnMpIGNvbXBhcmVkIHRvICoqYmVmb3JlKiogc3RpbXVsdXM6DQoNCmBgYHtyLCBmaWcud2lkdGg9MTAsIGVjaG89RkFMU0Usd2FybmluZz1GQUxTRX0NCg0KZ2dwbG90KGRhdGEgPSBjZWxscmFua3NfYmVmb3JlX3N0aW0sDQogICAgICAgbWFwcGluZyA9IGFlcyh4ID0gY2hhbmdlX3JhbmssIHkgPSBhY3Rpdml0eV9jaGFuZ2UpKSArDQogIGdlb21fcG9pbnQoZGF0YSA9IGNlbGxyYW5rc19iZWZvcmVfc3RpbSAlPiUgDQogICAgICAgICAgICAgICBkcGx5cjo6ZmlsdGVyKGNvbnRyb2wgPT0gRiksc2l6ZSA9IDYsDQogICAgICAgICAgICAgYWVzKGNvbCA9IHBvc2l0aW9uLA0KICAgICAgICAgICAgICAgICBzaGFwZSA9IHBpbmNoKQ0KICAgICAgICAgICAgICkgKw0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiSUwiID0gImdyZWVuIiwgInRyYW5zaWVudCIgPSAiYmx1ZSIsICJQRiIgPSAicmVkIiwgInVua25vd24iID0gImJsYWNrIiwgImNvbnRyb2wiID0gIm1hZ2VudGEiKSkgKyANCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IGMoIlRSVUUiID0gIisiLCAiRkFMU0UiID0gIi0iKSkgKw0KICBnZW9tX3BvaW50KGRhdGEgPSBjZWxscmFua3NfYmVmb3JlX3N0aW0gJT4lDQogICAgICAgICAgICAgICBkcGx5cjo6ZmlsdGVyKGNvbnRyb2wgPT0gVCksIHNpemUgPSAzLCBjb2wgPSAibWFnZW50YSIpICsNCiAgIyMjIGxhYmVsIGZvciBuZWdhdGl2ZSB2YWx1ZXMNCiAgZ2VvbV90ZXh0X3JlcGVsKGRhdGEgPSBjZWxscmFua3NfYmVmb3JlX3N0aW0gJT4lIA0KICAgICAgICAgICAgICAgICAgICBkcGx5cjo6ZmlsdGVyKGFjdGl2aXR5X2NoYW5nZSA8IDApLA0KICAgIGFlcyhsYWJlbCA9IGNlbGxfaWQpLA0KICAgIGRpcmVjdGlvbiA9ICJ5IiwNCiAgICBhbmdsZSA9IDkwLA0KICAgIGhqdXN0ID0gLjUsDQogICAgbnVkZ2VfeSA9IC0yDQogICAgKSArDQogIA0KICAjIyMgbGFiZWwgZm9yIHBvc2l0aXZlIHZhbHVlcw0KICBnZW9tX3RleHRfcmVwZWwoZGF0YSA9IGNlbGxyYW5rc19iZWZvcmVfc3RpbSAlPiUgDQogICAgICAgICAgICAgICAgICAgIGRwbHlyOjpmaWx0ZXIoYWN0aXZpdHlfY2hhbmdlID4gMCksDQogICAgYWVzKGxhYmVsID0gY2VsbF9pZCksDQogICAgZGlyZWN0aW9uID0gIngiLA0KICAgIGFuZ2xlID0gMCwNCiAgICBoanVzdCA9IC41LA0KICAgIG51ZGdlX3ggPSAtMQ0KICAgICkgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBjb2wgPSAiZ3JleSIsIGx0eSA9ICJkYXNoZWQiKSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IDI3LCB5ID0gLTE3LCBsYWJlbCA9ICJCYXNlbGluZSBhY3Rpdml0eSIsIGNvbCA9ICJncmF5IikgKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBjb2wgPSAiZ3JleSIsIGx0eSA9ICJkYXNoZWQiKSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IC0yLCB5ID0gMjgwLCBsYWJlbCA9ICJOZWdhdGl2ZSByYW5rOiBGUiBkZWNyZWFzZSIsIGNvbCA9ICJncmF5IiwgYW5nbGUgPSA5MCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSAyLCB5ID0gMjgwLCBsYWJlbCA9ICJQb3NpdGl2ZSByYW5rOiBGUiBpbmNyZWFzZSIsIGNvbCA9ICJncmF5IiwgYW5nbGUgPSA5MCkgKw0KICB0aGVtZV9taW5pbWFsKCkgKyANCiAgdGhlbWUoDQogICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyMCksDQogICAgdGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMjApDQogICkgKw0KICB4bGFiKCJSYW5rcyIpICsNCiAgeWxhYigiQ2hhbmdlIGluIGZpcmluZyByYXRlIFslXSIpICsNCiAgeWxpbSgtbWF4KGNlbGxyYW5rc19iZWZvcmVfc3RpbSRhY3Rpdml0eV9jaGFuZ2UpLG1heChjZWxscmFua3NfYmVmb3JlX3N0aW0kYWN0aXZpdHlfY2hhbmdlKSkgDQoNCg0KYGBgDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQo8YnI+PGJyPg0KDQpQbG90dGluZyB0aGUgY2hhbmdlIGluIE1GUiBmcm9tICIqYmFzZWxpbmUqIiB0byAiKmR1cmluZyBzdGltdWx1cyoiLiBDb2xvcmluZyBiYXNlZCBvbiB0aGUgc3RyZW5ndGggb2YgdGhlIGluaGliaXRpb24gKCpyYW5rKikNCg0KYGBge3IsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD0xMiwgZWNobz1GQUxTRSx3YXJuaW5nPUZBTFNFfQ0KZ2dwbG90KA0KICBkYXRhID0gVE9fUExPVCAlPiUNCiAgICBkcGx5cjo6ZmlsdGVyKA0KICAgICAgY29udHJvbCA9PSBGLA0KICAgICAgc3RpbV9jb25kID09ICJiYXNlbGluZSIgfCBzdGltX2NvbmQgPT0gImQiDQogICAgKSwNCiAgbWFwcGluZyA9IGFlcygNCiAgICB4ID0gZm9yY2F0czo6ZmN0X3JlbGV2ZWwoc3RpbV9jb25kLCAiYmFzZWxpbmUiLCAiZCIsICJhIiksDQogICAgeSA9IE1GUg0KICApDQopICsNCiAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4yLCBhbHBoYSA9IDAuNSkgKw0KICBnZW9tX3BvaW50KGFlcyhmaWxsID0gY2hhbmdlX3JhbmspLA0KICAgIHNoYXBlID0gMjEsDQogICAgIyBmaWxsID0gIiNFQjgxMDQiLA0KICAgICMgY29sb3IgPSAid2hpdGUiLA0KICAgIHNpemUgPSA0DQogICkgKw0KICAjIHN0cm9rZSA9IDIpICsNCiAgZ2VvbV9saW5lKA0KICAgIGFlcyhncm91cCA9IGNlbGxfaWQsIGNvbCA9IGNoYW5nZV9yYW5rKQ0KICApICsNCiAgZ2VvbV9sYWJlbF9yZXBlbCgNCiAgICBkYXRhID0gVE9fUExPVCAlPiUNCiAgICAgIGRwbHlyOjpmaWx0ZXIoDQogICAgICAgIGNvbnRyb2wgPT0gRiwNCiAgICAgICAgc3RpbV9jb25kID09ICJiYXNlbGluZSINCiAgICAgICksDQogICAgbWFwcGluZyA9IGFlcyhsYWJlbCA9IGNlbGxfaWQsIGNvbCA9IGNoYW5nZV9yYW5rKSwNCiAgICAjbnVkZ2VfeCA9IC0uMSwNCiAgICBkaXJlY3Rpb24gPSAieSIsDQogICAgaGp1c3QgPSA0LA0KICAgIHNlZ21lbnQuc2l6ZSA9IC4yDQogICkgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZSgNCiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDIwKSwNCiAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyMCkNCiAgKSArDQogIHhsYWIoIlJlY29yZGluZyBwZXJpb2QiKSArDQogIGxhYnMoZmlsbCA9ICJSYW5rIiAsY29sID0gIlJhbmsiKQ0KDQpgYGANCg0KDQo8YnI+PGJyPjxicj48YnI+PGJyPjxicj48YnI+PGJyPjxicj48YnI+PGJyPjxicj4NCg0KDQojIEFjdGl2aXR5IG9mIFBSRiBnbHljaW5lcmdpYyBjZWxscyBkdXJpbmcgUEZDIHBob3RvYWN0aXZhdGlvbg0KDQoNCmBgYHtyIGxvYWRpbmcgZGF0YSwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiMjIyBMT0FESU5HIFJFQ09SRElOR1MgKHRpYmJsZSB3aXRoIEFQIGFuZCBzdGltIHRpbWVzKSAjIyMjIyMjIyMjIyMjIyMNCnNvdXJjZShmaWxlLnBhdGgoInN1cHBsZW1lbnRhcnlfZnVuY3Rpb25zIiwgIkNyZWF0ZVJlY1RpYmJsZS5SIikpDQpSRUNPUkRJTkdTIDwtIENyZWF0ZVJlY1RpYmJsZSgNCiAgQVBfdGltZXMgPSByZWFkX2NzdihmaWxlLnBhdGgoImRhdGEiLCAiY29ydGljYWxfc3RpbSIsICJBUF90aW1lcy5jc3YiKSksDQogIHN0aW1fdGltZXMgPSByZWFkX2NzdihmaWxlLnBhdGgoImRhdGEiLCAiY29ydGljYWxfc3RpbSIsICJzdGltX3RpbWVzLmNzdiIpKQ0KKQ0KDQojIyMgYWRkaW5nIHN0aW11bHVzIG51bWJlciB3aXRoaW4gdHJhaW4NClJFQ09SRElOR1MgPC0gUkVDT1JESU5HUyAlPiUNCiAgbXV0YXRlKHN0aW1fbnVtYmVyID0gMCkNCg0KIyMjIGNhbGN1bGF0aW5nIHN0aW11bHVzIG51bWJlciB3aXRoaW4gdHJhaW4gDQppbml0aWFsX3ZhbHVlIDwtIFJFQ09SRElOR1Mkc3RpbV9mcmVxWzFdICU+JSANCiAgYGNvbW1lbnQ8LWAoIkZpcnN0IHZhbHVlIG9mIHN0aW1fZnJlcSB2YXJpYWJsZS4gV2hlbiBpdCBjaGFuZ2VzIHN0aW11bHVzIGNvdW50aW5nIHJlc3RhcnRzIikNCg0Kc3RpbV9jb3VudGVyIDwtIDEgJT4lIA0KICBgY29tbWVudDwtYCgiQ291bnRzIHN0aW11bGkgaW4gYSB0cmFpbiIpDQppbmRleCA8LSAxICU+JSANCiAgYGNvbW1lbnQ8LWAoIlRyYWNrcyB0aGUgcG9zaXRpb24gKGluZGV4KSBvZiBzdGltX2ZyZXEiKQ0KDQpSRUNPUkRJTkdTJHN0aW1fbnVtYmVyWzFdIDwtIHN0aW1fY291bnRlcg0KcmVwZWF0ew0KICBpZiAoUkVDT1JESU5HUyRzdGltX2ZyZXFbaW5kZXggKyAxXSA9PSBpbml0aWFsX3ZhbHVlKSB7DQogICAgUkVDT1JESU5HUyRzdGltX251bWJlcltpbmRleCArIDFdIDwtIHN0aW1fY291bnRlciArIDENCiAgICBzdGltX2NvdW50ZXIgPC0gc3RpbV9jb3VudGVyICsgMQ0KICAgIGluZGV4IDwtIGluZGV4ICsgMQ0KICB9IGVsc2Ugew0KICAgIGluaXRpYWxfdmFsdWUgPC0gUkVDT1JESU5HUyRzdGltX2ZyZXFbaW5kZXggKyAxXQ0KICAgIHN0aW1fY291bnRlciA8LSAxDQogICAgUkVDT1JESU5HUyRzdGltX251bWJlcltpbmRleCArIDFdIDwtIHN0aW1fY291bnRlcg0KICAgIGluZGV4IDwtIGluZGV4ICsgMQ0KICB9DQogIA0KICBpZiAoaW5kZXggPT0gbGVuZ3RoKFJFQ09SRElOR1Mkc3RpbV9udW1iZXIpKSB7DQogICAgYnJlYWsNCiAgfQ0KfQ0KDQojIyMgcmVwbGFjaW5nIHN0aW1fbnVtYmVyIHdpdGggTkEgYXQgIkFQIg0KUkVDT1JESU5HUyRzdGltX251bWJlcltSRUNPUkRJTkdTJHNpZ25hbF90eXBlID09ICJBUCJdIDwtIE5BDQoNCiMjIyBjYXRlZ29yaXppbmcgc3RpbXVsaQ0KUkVDT1JESU5HUyA8LSBSRUNPUkRJTkdTICU+JQ0KICBtdXRhdGUoc3RpbV9mcmVxX2NhdGVnID0gc3RpbV9mcmVxKSAlPiUNCiAgbXV0YXRlKHN0aW1fZnJlcV9jYXRlZyA9IHJlcGxhY2UoDQogICAgeCA9IHN0aW1fZnJlcV9jYXRlZywNCiAgICBsaXN0ID0gKHN0aW1fZnJlcV9jYXRlZyA9PSAxMiB8IHN0aW1fZnJlcV9jYXRlZyA9PSA4KSwNCiAgICB2YWx1ZXMgPSAxMA0KICApKSAlPiUNCiAgbXV0YXRlKHN0aW1fZnJlcV9jYXRlZyA9IHJlcGxhY2UoDQogICAgeCA9IHN0aW1fZnJlcV9jYXRlZywNCiAgICBsaXN0ID0gKHN0aW1fZnJlcV9jYXRlZyA9PSAxOCksDQogICAgdmFsdWVzID0gMjANCiAgKSkNCg0KYGBgDQoNCiogTGlzdCBvZiB0aWJibGVzIHVzZWQgdG8gc3RvcmUgZGF0YToNCiAgKyBSRUNPUkRJTkdTIHRpYmJsZTogc3RvcmVzIEFQIGFuZCBzdGltIHRpbWUgc3RhbXBzLCBudW1iZXIgb2Ygc3RpbXVsaSBpbiBlYWNoIHRyYWluLCBzdGltdWx1cyBmcmVxdWVuY3kgY2F0ZWdvcmllcyAoZWcuIDggMTAgYW5kIDEyIEh6IGJlbG9uZyB0byAxMCBIeiBjYXRlZ29yeSkNCiAgKyBTVElNX1JFU1VMVFM6IHN0b3JlcyB0aGUgZGF0YSBmb3IgUFNUSHMgDQoNCg0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCB0aWR5PVRSVUV9DQpkYXRhdGFibGUoUkVDT1JESU5HUywgDQogICAgICAgICAgY2FwdGlvbiA9IlJFQ09SRElOR1MgdGliYmxlIiwgDQogICAgICAgICAgcm93bmFtZXMgPSBUUlVFLCANCiAgICAgICAgICBvcHRpb25zID0gbGlzdChwYWdlTGVuZ3RoID0gNTAsIHNjcm9sbFg9VCwgc2Nyb2xsWSA9ICI1MDBweCIsIGRvbSA9ICd0JykpDQoNCg0KYGBgDQoNCg0KIyBTcG9udGFuZW91cyBkZXN5bmNocm9uaXphdGlvbiBvZiB0aGUgRkMgc2xvdyBvc2NpbGxhdGlvbiANCg0KDQoNCmBgYHtyLCAgZWNobz1GQUxTRSx3YXJuaW5nPUZBTFNFLG1lc3NhZ2U9RkFMU0V9DQpmaWxlX2xpc3QgPC0gbGlzdC5maWxlcygNCiAgcGF0aCA9ICJkYXRhIiwNCiAgcGF0dGVybiA9ICIqLm1hdCIsIGZ1bGwubmFtZXMgPSBGLCByZWN1cnNpdmUgPSBGDQopDQoNCmBgYA0KDQoNCmBgYHtyfQ0KZmlsZV90b19sb2FkIDwtIGZpbGVfbGlzdFtbMV1dDQpmaWxlbmFtZSA8LSBhcy5jaGFyYWN0ZXIoc3Vic3RyaW5nKGZpbGVfdG9fbG9hZCwgMSwgbmNoYXIoZmlsZV90b19sb2FkKSAtIDQpKQ0KcmF3LnJlYyA8LSByZWFkTWF0KGZpbGUucGF0aCgiZGF0YSIsIGZpbGVfdG9fbG9hZCkpDQoNCiMjI3Rha2VzIHRoZSBmaXJzdCBBUCAoZmlyc3Qgcm93KSBhbmQgdGVsbHMgdGhlIGluZGV4IG9mIHBvaW50IHdpdGggdGhlIG1heCB2YWx1ZQ0KcG9pbnRzX3RvX3BlYWsgPC0gd2hpY2gocmF3LnJlYyRhcFssICwgMV0kdmFsdWVzWzEsIF0gPT0NCiAgICBtYXgocmF3LnJlYyRhcFssICwgMV0kdmFsdWVzWzEsIF0pKSAlPiUNCiAgICBhcy5udW1lcmljKCkNCg0KIyMjIHRpbWUgb2YgdGhlIHBlYWsgb2YgdGhlIEFQcyBhZnRlciBpdHMgZmlyc3QgcG9pbnQNCnJhdy5yZWMkYXBbLCAsIDFdJGludGVydmFsICogcG9pbnRzX3RvX3BlYWsNCg0KYXAgPC0gcmF3LnJlYyRhcFssICwgMV0kdGltZXMgJT4lIGFzLmRvdWJsZSgpDQphcF9wZWFrcyA8LSB0aWJibGUocGVha190aW1lcyA9IChhcCArIGMocmF3LnJlYyRhcFssICwgMV0kaW50ZXJ2YWwgKiBwb2ludHNfdG9fcGVhaykpKQ0KDQoNCmBgYA0KDQoNCi0tLS0tLS0gaW5zZXJ0IGNvZGUgaGVyZSAtLS0tLS0tLQ0KIA0KKHNwb250X2Rlc3luY2hyb25fYW5hbHlzaXMuUiksIDcgcmVjb3JkaW5ncw0KDQojIFRlcm1pbmFscw0KDQojIyBMb2FkaW5nIGRhdGENCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgdGlkeT1UUlVFfQ0KZmlsZV9wYXRoIDwtIGZpbGUucGF0aCgnZGF0YScsDQogICAgICAgICAgICAgICAgICAgICAgICdFbWlfdGVybWluYWxzJywNCiAgICAgICAgICAgICAgICAgICAgICAgJ3Rlcm1pbmFsX21lYXN1cmVzLmNzdicgKSAgDQpURVJNSU5BTFMgPC0gcmVhZC50YWJsZShmaWxlID0gZmlsZV9wYXRoLCBzZXAgPSAnOycsIGhlYWRlciA9IFQsIG5hLnN0cmluZyA9ICduYScpDQpoZWFkKFRFUk1JTkFMUykNCg0KYGBgDQoNCiMjIEJvdXRvbiBhcmVhIG9uIGRpZmZlcmVudCBkZW5kcml0aWMgZG9tYWlucw0KDQpgYGB7ciBlY2hvPUZBTFNFLCBmaWcud2lkdGg9MTAsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpnZ3Bsb3QoZGF0YSA9IFRFUk1JTkFMUywgbWFwcGluZyA9IGFlcyh4ID0gcG9zdGlvbiwgeSA9IGJfYXJlYSkpICsNCiAgZ2VvbV9oYWxmX3Zpb2xpbihwb3NpdGlvbiA9IHBvc2l0aW9uX251ZGdlKHg9LS4xNSksDQogICAgICAgICAgICAgICAgICB0cmltID0gRiwNCiAgICAgICAgICAgICAgICAgIHNpZGUgPSAibCIsDQogICAgICAgICAgICAgICAgICBzY2FsZSA9ICJhcmVhIiwNCiAgICAgICAgICAgICAgICAgIGRyYXdfcXVhbnRpbGVzID0gYygwLjUpLA0KICAgICAgICAgICAgICAgICAgYWVzKGZpbGwgPSBwb3N0aW9uKSkgKw0KICBnZW9tX2ppdHRlcihwb3NpdGlvbiA9IHBvc2l0aW9uX2ppdHRlcigwLjEpKQ0KDQpgYGANCg0KIyMgQXJlYSBvZiBib3V0b25zIHdpdGggKm0yKiBhbmQgKnVua25vd24qIG9yaWdpbg0KDQpgYGB7ciBmaWcud2lkdGg9MTAsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9DQpnZ3Bsb3QoZGF0YSA9IFRFUk1JTkFMUywNCiAgICAgICBtYXBwaW5nID0gYWVzKHggPSBvcmlnaW4sIHkgPSBiX2FyZWEpKSArDQogIGdlb21faGFsZl92aW9saW4ocG9zaXRpb24gPSBwb3NpdGlvbl9udWRnZSh4PS0uMTUpLA0KICAgICAgICAgICAgICAgICAgIHRyaW0gPSBGLA0KICAgICAgICAgICAgICAgICAgIHNpZGUgPSAibCIsDQogICAgICAgICAgICAgICAgICAgc2NhbGUgPSAiY291bnQiLA0KICAgICAgICAgICAgICAgICAgIGRyYXdfcXVhbnRpbGVzID0gYygwLjUpDQogICAgICAgICAgICAgICAgICAgI2ZpbGwgPSBhbHBoYSgwLjEpLA0KICAgICAgICAgICAgICAgICAgICNhZXMoY29sID0gcG9zdGlvbikNCiAgICAgICAgICAgICAgICAgICApICsNCiAgZ2VvbV9qaXR0ZXIocG9zaXRpb24gPSBwb3NpdGlvbl9qaXR0ZXIoMC4xKSwNCiAgICAgICAgICAgICAgYWVzKGNvbCA9IHBvc3Rpb24pKSArDQogIGFubm90YXRlKCJ0ZXh0IiwNCiAgICAgICAgICAgeCA9IDAuNywgDQogICAgICAgICAgIHkgPSAxLCANCiAgICAgICAgICAgbGFiZWwgPSBwYXN0ZSgibiA9ICIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgIFRFUk1JTkFMUyAlPiUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwX2J5KG9yaWdpbikgJT4lIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VtbWFyaXNlKG4gPSBsZW5ndGgoYl9hcmVhKSkgJT4lDQogICAgICAgICAgICAgICAgICAgICAgICAgICBkcGx5cjo6ZmlsdGVyKG9yaWdpbiA9PSAibTIiKSAlPiUgDQogICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3QobikgJT4lDQogICAgICAgICAgICAgICAgICAgICAgICAgICBhcy5jaGFyYWN0ZXIoKSkNCiAgICAgICAgICAgKSArDQogIGFubm90YXRlKCJ0ZXh0IiwNCiAgICAgICAgICAgeCA9IDEuNiwgDQogICAgICAgICAgIHkgPSAxLCANCiAgICAgICAgICAgbGFiZWwgPSBwYXN0ZSgibiA9ICIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgIFRFUk1JTkFMUyAlPiUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwX2J5KG9yaWdpbikgJT4lIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VtbWFyaXNlKG4gPSBsZW5ndGgoYl9hcmVhKSkgJT4lDQogICAgICAgICAgICAgICAgICAgICAgICAgICBkcGx5cjo6ZmlsdGVyKG9yaWdpbiA9PSAidW5rbm93biIpICU+JSANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdChuKSAlPiUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzLmNoYXJhY3RlcigpKQ0KICApDQpgYGANCg0K